/*
 * StaticModelEntity.h
 *
 *  Created on: 17 févr. 2011
 *      Author: seeme
 *      Le static ne veut rien dire...
 *      une ModelEntity est un model affichable
 *      qui a une position, une rotation et un scale
 *      ces 3 vecteurs seront remplacés par des matrices.
 */

#ifndef STATICMODELENTITY_H_
#define STATICMODELENTITY_H_

#include "../../Tools/Geometry/Vect4.h"
#include "../../Tools/Geometry/Matrix4.h"
#include "AbstractEntity.h"

#include "../../Memory/Resources/Models/Mesh.h"
#include "../../Memory/ResCache.h"
#include "../../Memory/Resources/TextBased/Shaders/Shader.h"


#define TABINDEXSIZE 4

class StaticDrawableEntity: public AbstractEntity {
public:

	StaticDrawableEntity(Vect4<float> position, Vect4<float> rotation, Vect4<float> scale, Mesh* model);
	StaticDrawableEntity(){};
	virtual ~StaticDrawableEntity();

	virtual void print(std::ostream& o) const {
		o << "StaticModelEntity:(" << m_transfos << ")";
	}

	//TODO:
	//La structure objet est à revoir...
	void draw(std::string programName);

	std::string getModelName();
	Vect4<float>& getPosition(){return m_position;}

	void setVBOs();

	Matrix4<float>& getTransfos(const Matrix4<float>& model);

	GLuint getProgramId(const char* name){return getProgramId(std::string(name));}
	GLuint getProgramId(std::string name){return m_model->getProgramId(name);}

private:
	void computTransfos(Vect4<float>& translation, Vect4<float>& rotation, Vect4<float>& scale);


protected:
	Mesh* m_model;
	Vect4<float> m_position;
	Matrix4<float> m_initialTransfos;

	Matrix4<float> m_transfos;

	//Index des vertices et des normales
	GLuint m_tabIndex[TABINDEXSIZE];
};

#endif /* STATICMODELENTITY_H_ */
